/* 
 * File:   OperateurMap.cpp
 * Author: Gab'z
 * 
 * Created on 8 mai 2012, 02:04
 */

#include "OperateurMap.h"
#include "operator_exception.h"
#include "Add.h"

OperateurMap* OperateurMap::instance = 0;

OperateurMap::OperateurMap() {
    // on ajoute ici un par un les instances des operateurs fixes à la map
    Add* add = new Add("+");
    std::pair<const std::string, Operateur*> paire(add->getName(), add);
    _operateurMap.insert(paire);

    // TODO
    // AUTRES OPERATEURS

}

OperateurMap::~OperateurMap() {
    for (std::map<const std::string, Operateur*>::iterator it = _operateurMap.begin();
            it != _operateurMap.end();
            ++it) {
        delete it->second;
    }
    _operateurMap.clear();

    for (std::map<const std::string, UserCommand*>::iterator it = _userCommandMap.begin();
            it != _userCommandMap.end();
            ++it) {
        delete it->second;
    }
    _userCommandMap.clear();
}

// concerne uniquement les commandes utilisateur

void OperateurMap::addReplaceUserCommand(UserCommand* uc) {
    std::map<const std::string, UserCommand*>::iterator it = _userCommandMap.find(uc->getName());
    if (it != _userCommandMap.end()) {
        delete it->second;
        _userCommandMap.erase(it);
    }
    std::pair<const std::string, UserCommand*> paire(uc->getName(), uc);
    _userCommandMap.insert(paire);
    //    std::pair<std::string, Operateur*> paire(uc.getName(), uc);
    //    if (_userCommandMap.find(uc->_name) != _userCommandMap.end()) {
    //        delete _userCommandMap.find(uc->_name);
    //        _userCommandMap.erase(uc->_name);
    //    }
    //    _userCommandMap.insert(paire);
}

// ne doit etre utilisé que lors des actions undo/redo

void OperateurMap::removeOperateur(const std::string& str) {
    std::map<const std::string, UserCommand*>::iterator it = _userCommandMap.find(str);

    if (it != _userCommandMap.end()) {
        delete it->second;
        _userCommandMap.erase(it);
    } else {
        throw OperatorException("Erreur de suppression de l'opérateur. Cet opérateur n'existe pas : " + str);
    }
}

bool OperateurMap::isOperateurName(const std::string& str) const {
    return (_operateurMap.find(str) != _operateurMap.end() || _userCommandMap.find(str) != _userCommandMap.end());
}

Operateur* OperateurMap::getOperateur(const std::string& str) const throw (OperatorException) {
    std::map<const std::string, Operateur*>::const_iterator it = _operateurMap.find(str);
    if (it == _operateurMap.end()) throw OperatorException("Cet opérateur n'existe pas : " + str);
    else return it->second;
}